View Javadoc

1   package org.votech.ds6.plastlets;
2   
3   import java.io.File;
4   import java.io.IOException;
5   import java.net.URL;
6   import java.util.ArrayList;
7   import java.util.Collection;
8   import java.util.HashSet;
9   import java.util.List;
10  import java.util.Set;
11  
12  import org.apache.commons.logging.Log;
13  import org.apache.commons.logging.LogFactory;
14  import org.astrogrid.acr.builtin.ACR;
15  import org.jdesktop.jdic.desktop.Desktop;
16  import org.jdesktop.jdic.desktop.DesktopException;
17  import org.jdesktop.jdic.desktop.Message;
18  import org.votech.plastic.PlasticHubListener;
19  import org.votech.plastic.managers.AcrManager;
20  import org.votech.plastic.managers.PlasticManager;
21  import org.votech.plastic.managers.AcrManager.AcrObserver;
22  import org.votech.plastic.managers.PlasticManager.PlasticHubObserver;
23  /***
24   * Manages creation and registration of Plastlets.
25   * @author jdt
26   *
27   */
28  public class PlastletsManager implements PlasticHubObserver, AcrObserver {
29  	
30  	public interface PlastletChangeListener {
31  		void plastletsChanged();
32  	}
33  	private List<PlastletChangeListener> listeners = new ArrayList<PlastletChangeListener>();
34  	public PlastletsManager(AcrManager acrManager, PlasticManager plasticManager) {
35  		this.acrManager = acrManager;
36  		this.plasticManager = plasticManager;
37  		plasticManager.addObserver(plasticManager.new ObserverAdaptor(this));
38  		acrManager.addObserver(acrManager.new ObserverAdaptor(this));
39  	}
40  	public void add(PlastletChangeListener listener) {
41  		listeners.add(listener);
42  	}
43  	private void notifyListeners() {
44  		for (PlastletChangeListener l : listeners) {
45  			l.plastletsChanged();
46  		}
47  	}
48  	
49  
50  	/***
51  	 * Logger for this class
52  	 */
53  	private static final Log logger = LogFactory.getLog(PlastletsManager.class);
54  
55  	private PlasticManager plasticManager;
56  
57  	private Set<Plastlet> jdicPlastlets = new HashSet<Plastlet>();
58  	private Set<Plastlet> acrPlastlets = new HashSet<Plastlet>();
59  
60  	private AcrManager acrManager;
61  
62  
63  
64  
65  	public boolean enablePlastlet(Plastlet plastlet, boolean enable) {
66  		Collection<Plastlet> plastlets = getPlastlets();
67  		if (!plastlets.contains(plastlet)) return false;
68  		final PlasticHubListener hub = plasticManager.getHub();
69  		if (hub==null) return false;
70  		boolean success;
71  		if (enable) {
72  			success = plastlet.register(hub);
73  		} else {
74  			success = plastlet.unregister();
75  		}
76  		return success;
77  	}
78  	
79  	public Collection<Plastlet> getPlastlets() {
80  		Set<Plastlet> allPlastlets = new HashSet<Plastlet>(acrPlastlets);
81  		allPlastlets.addAll(jdicPlastlets);
82  		return allPlastlets;
83  	}
84  	
85  	private void unregisterAllPlastlets() {
86  		logger.debug("Unregistering all plastlets");
87  		unregisterPlastlets(jdicPlastlets);
88  		unregisterPlastlets(acrPlastlets);
89  	}
90  
91  
92  
93  	private void unregisterPlastlets(Collection<Plastlet> plastlets) {
94  		if (plasticManager.isConnected()) {
95  			for (Plastlet plastlet : plastlets) {
96  				plastlet.unregister();
97  			}
98  		}
99  		plastlets.clear();
100 	}
101 
102 	public void createAndRegisterAllPlastlets() {
103 		logger.debug("Creating all Plastlets");
104 		if (!plasticManager.isConnected()) {
105 			logger.warn("PlastletManager's PlasticManager isn't connected.  Cannot register plastlets.");
106 			return; //just to be on the safe side
107 		}
108 		
109 		createAndRegisterJdicPlastlets();
110 		createAndRegisterAcrPlastlets();
111 	}
112 
113 
114 
115 	private synchronized void createAndRegisterJdicPlastlets() {
116 		createJdicPlastlets();
117 		registerPlastlets(jdicPlastlets);
118 	}
119 
120 
121 
122 	private synchronized void createAndRegisterAcrPlastlets() {
123 		createACRPlastlets();
124 		registerPlastlets(acrPlastlets);
125 	}
126 
127 
128 
129 	private void createJdicPlastlets() {
130 		Set<Plastlet> oldJdicPlastlets = new HashSet<Plastlet>(jdicPlastlets);
131 		
132 		
133 		// All the following use the Desktop.
134 		if (CheckJDICPresent.desktop.check()) {
135 
136 			// Browser - could also add a JNLP version of this in case no JDIC.
137 			Plastlet browserPlastlet = new BrowserPlastlet(new BrowserPlastlet.BrowserControl() {
138 
139 				public boolean openURL(URL url) {
140 					try {
141 						Desktop.browse(url);
142 					} catch (DesktopException e) {
143 						logger.error("Unable to open url "+url+" in the system browser",e);
144 					}
145 					return true;
146 				}
147 
148 			}, plasticManager.getId());
149 			jdicPlastlets.add(browserPlastlet);
150 
151 			// Email - currently doesn't work so well due to problems
152 			// with jdic
153 			Plastlet emailPlastlet = new EmailPlastlet(plasticManager.getId(), new EmailPlastlet.Mailer() {
154 
155 				public void mail(EmailPlastlet.Message message) throws DesktopException {
156 					// Convert between jdics message format, and our own.
157 					Message jdicMessage = new Message();
158 					jdicMessage.setSubject(message.getSubject());
159 					jdicMessage.setBody(message.getBody());
160 					try {
161 						jdicMessage.setAttachments(message.getAttachments());
162 					} catch (IOException e) {
163 						logger.warn("One of the attached files was not readable, ignoring", e);
164 						jdicMessage.setBody("Unable to attach file");
165 					}
166 					Desktop.mail(jdicMessage);
167 
168 				}
169 
170 			});
171 
172 			jdicPlastlets.add(emailPlastlet);
173 
174 			// Print
175 			Plastlet printPlastlet = new PrintPlastlet(plasticManager.getId(), new PrintPlastlet.Printer() {
176 
177 				public void print(File file) throws Exception {
178 					Desktop.print(file);
179 				}
180 			});
181 			jdicPlastlets.add(printPlastlet);
182 
183 			
184 		}
185 		if (!oldJdicPlastlets.equals(jdicPlastlets)) notifyListeners();
186 	}
187 
188 
189 
190 	private void registerPlastlets(Collection<Plastlet> plastlets) {
191 		final PlasticHubListener hub = plasticManager.getHub();
192 		if (hub==null) {
193 			logger.debug("Failed to register plastlets - hub not ready");
194 			return;
195 		}
196 		
197 		Collection<Plastlet> toRemove = new HashSet<Plastlet>();
198 		//register them
199 		for (Plastlet plastlet : plastlets) {
200 			boolean success;
201 			try {
202 				
203 				success = plastlet.register(hub);
204 			} catch (RuntimeException e) {
205 				logger.warn("Error when try to register plastlet "+plastlet.getMetaData().getName(),e);
206 				success=false;
207 			}
208 			if (!success) {
209 				//must be already registered by someone else
210 				toRemove.add(plastlet);
211 			}
212 		}
213 		logger.debug("Created plastlets: "+plastlets.size());
214 		logger.debug("Removing: "+toRemove.size());
215 		plastlets.removeAll(toRemove);
216 		logger.debug("Leaving: "+plastlets.size());
217 	}
218 
219 
220 
221 	private void createACRPlastlets() {
222 		if (!acrManager.isConnected()) return;
223 		
224 		Set<Plastlet> oldAcrPlastlets = new HashSet<Plastlet>(acrPlastlets);
225 		
226 		ACR acr = acrManager.getAcr();
227 		//Save2MySpace		
228 		Plastlet savePlastlet = new SaveToMySpacePlastlet(plasticManager.getId(),acr);
229 		acrPlastlets.add(savePlastlet);
230 		
231 		if (!oldAcrPlastlets.equals(acrPlastlets)) {
232 			notifyListeners();
233 		}
234 	}
235 
236 	public void hubUp(PlasticHubListener hub) {
237 		logger.info("Hub started");
238 		createAndRegisterAllPlastlets();
239 	}
240 
241 	public void hubDown() {
242 		logger.info("Hub stopped");
243 		unregisterAllPlastlets();
244 		acrPlastlets.clear();
245 		jdicPlastlets.clear();
246 		notifyListeners();
247 	}
248 
249 
250 
251 	public void acrUp() {
252 		logger.info("ACR Up");
253 		createAndRegisterAcrPlastlets();
254 	}
255 
256 
257 
258 	public void acrDown() {
259 		logger.info("ACR Down");
260 		Set<Plastlet> oldAcrPlastlets = new HashSet<Plastlet>(acrPlastlets);
261 		unregisterPlastlets(acrPlastlets);
262 		acrPlastlets.clear();
263 		if (!oldAcrPlastlets.equals(acrPlastlets)) notifyListeners();
264 	}
265 	public void shutDown() {
266 		unregisterAllPlastlets();
267 		plasticManager.disconnect();
268 	}
269 	public PlasticManager getPlasticManager() {
270 		return plasticManager;
271 	}
272 	public AcrManager getAcrManager() {
273 		return acrManager;
274 	}
275 	
276 }